package fr.miage.course7.app.model;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;

/**
 * Donnees concernant la course.
 */
public class Course {

    /**
     * Liste des participants indexes par leurs indentifiants.
     */
    private HashMap<Integer, Participant> participants;
    /**
     * Liste des etapes obligatoires de la course.
     */
    private ArrayList<Position> etapes;
    /**
     * Liste des etapes de l'itineraire propose pour la course.
     */
    private ArrayList<Position> itineraire;
    
    private CalculDistance classement;

    /**
     * Constructeur simple.
     * Le client devra remplir ces listes lorsque la connexion
     * avec le serveur sera etablie
     */
    public Course() {
        this.participants = new HashMap<Integer, Participant>();
        this.etapes = new ArrayList<Position>();
        this.itineraire = new ArrayList<Position>();
        this.classement = new CalculDistance();
    }

    /**
     * Demarre une course a partir de plusieurs parametres.
     * @param etapes ArrayList<Position> indiquant les etapes obligatoires
     * @param itineraire ArrayList<Position> indiquant les etapes
     *                   proposees pour l'itineraire
     * @param participants HashMap<Integer, Participant> contenant
     *                     l'association des identifiants aux participants
     */
    public Course(final ArrayList<Position> etapes,
                final ArrayList<Position> itineraire,
                final HashMap<Integer, Participant> participants) {
        this.etapes = etapes;
        this.itineraire = itineraire;
        this.participants = participants;
        this.classement = new CalculDistance();

        //affichage des coordonees des etapes obligatoire
        for (int i = 0; i < etapes.size(); ++i) {
            System.out.println(i + " : " + etapes.get(i));
        }

        //affichage des participants
        for (Participant p : participants.values()) {
            System.out.println(p);
        }
        System.out.println();

        //transmissions des participants
        participants.get(1).nouvelleTransmission(
                            new GregorianCalendar(), 10, 2, 1);
        participants.get(2).nouvelleTransmission(
                            new GregorianCalendar(), 10, 3, 1);
        participants.get(18).nouvelleTransmission(
                            new GregorianCalendar(), 10, 20, 1);
        participants.get(6).nouvelleTransmission(
                            new GregorianCalendar(), 10, 5, 1);

        //re-affichage des participants
        for (Participant p : participants.values()) {
            System.out.println(p);
        }

        //transmissions des participants
        participants.get(1).nouvelleTransmission(
                            new GregorianCalendar(), 9, 2, 0);
        participants.get(2).nouvelleTransmission(
                            new GregorianCalendar(), 7, 3, 0);
        participants.get(18).nouvelleTransmission(
                            new GregorianCalendar(), 8, 20, 0);
        participants.get(6).nouvelleTransmission(
                            new GregorianCalendar(), 6, 5, 0);

        //re-re-affichage des participants
        for (Participant p : participants.values()) {
            System.out.println(p);
        }
    }

    /**
     * Retourne la liste des etapes obligatoires.
     * @return un ArrayList<Position> contenant les etapes obligatoires
     */
    public final ArrayList<Position> getEtapesObligatoires() {
        return etapes;
    }

    /**
     * Retourne la liste des etapes proposees de l'itineraire.
     * @return un ArrayList<Position> contenant
     *         les etapes proposees de l'itineraire
     */
    public final ArrayList<Position> getItinerairePrevu() {
        return itineraire;
    }

    /**
     * Retourne la liste des participants.
     * @return un HashMap<Integer, Participant> contenant les associations
     *         identifiant->participant
     */
    public final HashMap<Integer, Participant> getParticipants() {
        return participants;
    }

    /**
     * Retourne la prochaine etape a atteindre par le participant p.
     * @param p le participant dont on souhaite connaitre la prochaine etape
     *          qu'il doit atteindre
     * @return la prochaine etape a atteindre
     */
    public final Position getProchaineEtape(final Participant p) {
        return etapes.get(p.getDerniereEtape()); //l'index commencant a 0
    }

    /**
     * Defini la liste des etapes.
     * @param etapes la liste des etapes obligatoires de la course
     */
    public final void setEtapes(final ArrayList<Position> etapes) {
        this.etapes = etapes;
    }

    /**
     * Defini la liste des etapes de l'itineraire propose.
     * @param itineraire la liste des etapes de l'itineraire propose
     */
    public final void setItineraire(final ArrayList<Position> itineraire) {
        this.itineraire = itineraire;
    }
    
    public CalculDistance getClassement(){
    	return classement;
    }
    
    public ArrayList<Position> getEtapes(){
    	return etapes;
    }

    public ArrayList<Position> getItineraire(){
    	return itineraire;
    }
}
